//
//  WBStatusListViewModel.swift
//  新浪微博
//
//  Created by 名品导购网MPLife.com on 2017/11/27.
//  Copyright © 2017年 sweet. All rights reserved.
//

import Foundation
import SDWebImage
//如果类需要使用KVC或字典转模型框架设置对象值，类就继承自NSObject
//如果类只是包装一些代码逻辑 可以不用任何父类，好处：更加轻量级
//如果用OC写 一律都继承自NSObject

private let maxPullupTryTimes = 3
class WBStatusListViewModel{
    
    //微博视图模型的懒加载
//    lazy var statusList = [WBStatus]()
    lazy var statusList = [WBStatusViewModel]()

    private var pullupErrorTimes = 0//上拉加载一旦出错，就加一，到3后不再加载

    //加载微博列表
    //网络请求是否成功
    //pullup是否上拉刷新
    
 
    
    func loadStatus(pullUp:Bool,completion:@escaping (_ isSuccess:Bool,_ shouldRefresh:Bool)->()) {
        //判断是否为上拉加载 同时检查刷新错误
        
        if pullUp && pullupErrorTimes > maxPullupTryTimes {
            completion(true, false)
            return
        }
        
        //since_id 下拉取出数组中第一条微博的id
        let since_id =  pullUp ? 0 : (statusList .first?.status.id ?? 0)
        //max_id上拉取出数组中最后一条id
        let max_id = !pullUp ? 0 : (statusList .last?.status.id ?? 0)
        //让数据访问层加载数据
        WBStatusListDAL.loadStatus(since_id: since_id, max_id: max_id) { (list, isSuccess) in
//        }
//        WBNetworkManager .shared .statusList(since_id: since_id,max_id: max_id) { (list, isSuccess) in
            //网络请求是否成功
            if !isSuccess {
                //直接回调返回
                completion(false, false)
                return
            }
            //定义结果可变数组
            var array = [WBStatusViewModel]()
            for dict in list ?? [] {
               /* //创建微博模型
                //如果创建模型失败，继续后续的创建
                guard let model = WBStatus .yy_model(with: dict) else{
                    continue
                }
                //讲视图模型添加到数组
                array .append(WBStatusViewModel(model: model))*/
                let  status = WBStatus()
                status .yy_modelSet(with: dict)
                let viewModel = WBStatusViewModel(model: status)
                array.append(viewModel)
            }
            //字典转模型 (所有第三方框架都支持嵌套的字典转模型)
            /*guard let array = NSArray .yy_modelArray(with: WBStatus .self, json: list ?? []) as? [WBStatus] else{
                //字典转模型时报，没有数据，会走进此方法 没有上拉加载
                completion(isSuccess, false)
                return
            }*/
            //拼接数据
            //下拉刷新，将结果数组拼接在数组前面
            
            if pullUp {
                //上拉加载
                self .statusList += array
            }else{
                //下拉刷新
                self.statusList = array + self.statusList
            }
            //判断上拉加载的数据量
            
            if pullUp && array.count == 0 {
               self.pullupErrorTimes += 1
                completion(isSuccess, false)//上拉加载没有更多数据
            }else{
                //数据缓存
                self.cacheSingleImage(list: array, finish: completion)
                //闭包可以当做参数来传递
//                completion(isSuccess, true)
            }
        }
    }
    //缓存本次下载微博数组中的单张图像 长图
    //缓存完单张图像 并且修改过配图视图的大小之后再回调 才能保证表格比例显示单张图像
    private func cacheSingleImage(list:[WBStatusViewModel],finish:@escaping (_ isSuccess:Bool,_ shouldRefresh:Bool)->()){
        //调度组
        let group = DispatchGroup()
        //记录数据长度
        var length = 0
        //遍历数组，查找微博数据中的单张图像
        //optional +cmd +左
        for vm in list {
            
            if vm.picURLs?.count != 1 {
                continue
            }
            //获取图像模型
            guard let pic = vm.picURLs?[0].thumbnail_pic,let url = URL(string: pic) else{
                continue
            }
//            print("要缓存的url是 + \(String(describing: url))")
            //loadImage 是sdwebImage的核心方法
            //图像下载完成之后，自动保存在路径中 路径是url的MD5
            //如果沙盒中已经存在缓存的图像 SDWebImage 后续SD 通过url加载图像 都会加载本地沙盒的图像 不会发起网络请求 同时回调方法 同样会调用
            //同样的方法和调用，但是内部不会再次发起网络请求
            //如果要缓存的图像累计很大 要通过后台接口
            
            
            //入组
            group .enter()
            

            
            SDWebImageManager.shared().loadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _, _, _) in
                if let image = image,let data = UIImagePNGRepresentation(image){
                    length += data.count
                    vm .updateSingleImageSize(image: image)
                }
//                print("缓存的图像是----\(String(describing: image))+长度是\(length)")
                
                //出租 一定要放在回调的最后一句
                group.leave()
            })
        }
    //监听调度组情况
        group.notify(queue: DispatchQueue.main) {
//            print("图像缓存完成\(length / 1024) k")
            finish(true, true)
        }
    }
}








